/* 
 * File:   main.cpp
 * Author: stuart
 *
 * Created on August 24, 2011, 1:26 PM
 */

// BRICimplementation.cpp : Defines the entry point for the console application.
//

#include "Nodo.h"
#include "Node.h"
#include "Util.h"
#include "Midia.h"
#include "Imagem.h"
#include "Pagina.h"
#include "Texto.h"
#include "Documento.h"
#include <sstream>
#include <algorithm>

/*
	Funcao que verifica a existencia de um nodo no vetor passado como parametro, retornando o nodo com nome correspondente, ou NULL - caso nao haja nodo com nome igual 
	ao nome passado como parametro.
*/
Nodo* getNodoPorNome(vector<Nodo*> nodos, string name){
	for(int i=0; i<nodos.size(); i++) {
		if(nodos.at(i)->getName() == name) {
			return nodos.at(i);
		}
	}
	return NULL;
}

/*
	Funcao que calcula e retorna o score de um dado conjunto de nos (uma dada arvore), recebe como parametros: nodos - vetor de nos que correspondem a uma arvore, aspectPage - o valor do aspect ratio da pagina corrente, aspectPBB - o aspect ratio da caixa delimitadora principal (principal bounding box), areaProportionPBB - a area proportion da caixa delimitadora principal.
*/
double score(vector<Nodo> nodos, double aspectPage, double aspectPBB, double areaProportionPBB){
	// variavel usada para armazenar o valor do score da arvore que sera retornado.
	double scoreTree = 0;
	double sumAreaProportions = 0;
	// somatorio das area proportions de todos os nos da arvore.
	for(int i=0; i < nodos.size(); i++){
		sumAreaProportions += nodos.at(i).getAreaProportion();
	}
	// calculo do score da arvore.
	scoreTree = G*(sumAreaProportions/areaProportionPBB)*(min(aspectPBB, aspectPage)/max(aspectPBB, aspectPage));
	return scoreTree;
}

/*
	Funcao usada para montar a arvore de nodos correspondente as fotografias a serem inseridas no documento e os cortes (horizontais ou verticais) realizados na(s) pagina(s) do documento.
*/
/*Nodo montaArvore(vector<Imagem> imagens)*/
vector<Nodo*> montaArvore(vector<Imagem> imagens){
	int numImg = imagens.size();
	int i, j;
	j  = 0;
	vector<Nodo*> nodos;
	for(i = 0; i < 2*numImg-1; i++){
		std::string s = "No ";
		std::stringstream out;
		out << i;
		s = s + out.str();
		Nodo* no = new Nodo();
		if(i >= numImg-1){
			no->setName(imagens.at(j).getPath());
			no->setAreaProportion(imagens.at(j).getAreaProportion());
			no->setAspectRatio(imagens.at(j).getAspectRatio());
                        // no -> setHpdfImage(HPDF_Image im); !!!
			j++;
		}else{
			
			no->setName(s.c_str());
		}
		nodos.push_back(no);
	}
	nodos.at(0)->setParent(NULL);
	/*for(i = 1; i < 2*numImg-1; i++){
		if(i % 2 != 0){
			nodos.at(i)->setParent(nodos.at((i-1)/2));
		} else{
			nodos.at(i)->setParent(nodos.at((i-2)/2));
		}
	}
	for(i = 0; i <= nodos.size()/(numImg-1); i++){
		nodos.at(i)->setChildLeft(nodos.at(2*i+1));
		nodos.at(i)->setChildRight(nodos.at(2*i+2));
	}*/

	return nodos;
}

/* Nodo atualizaDimensoes(Nodo raiz, int alpha, int gama, int altura, int largura) */
vector<Nodo*> atualizaDimensoes(vector<Nodo*> nodos, vector<Imagem> imagens, Util u){
	int i;
	int numImgs = imagens.size();
	for(i = nodos.size()/(numImgs-1); i >= 0; i--){
		Nodo* left = nodos.at(i)->getChildLeft();
		Nodo* right = nodos.at(i)->getChildRight();
		if(left->getAspectRatio() > 1){ 
			nodos.at(i)->setAreaProportion(u.areaProportionSideBySide(right->getAspectRatio(), left->getAspectRatio(), right->getAreaProportion(), left->getAreaProportion()));
			nodos.at(i)->setAspectRatio(u.aspectRatioSideBySide(right->getAspectRatio(), left->getAspectRatio(), right->getAreaProportion(), left->getAreaProportion()));
			nodos.at(i)->setName("V");
		} else if(left->getAspectRatio() <= 1){
			nodos.at(i)->setAreaProportion(u.areaProportionTop(right->getAspectRatio(), left->getAspectRatio(), right->getAreaProportion(), left->getAreaProportion()));
			nodos.at(i)->setAspectRatio((u.aspectRatioTop(right->getAspectRatio(), left->getAspectRatio(), right->getAreaProportion(), left->getAreaProportion())));
			nodos.at(i)->setName("H");
		}
	}
	return nodos;
}


vector<Imagem> atualizaDimensoesImagens(vector<Imagem> imagens, Util u, double ePBB, double areaPBB){
	for(int i = 0; i < imagens.size(); i++){
		Imagem img = imagens.at(i);
		img.setArea(u.areaFoto(img.getAreaProportion(), ePBB, areaPBB));
		img.setTamLarg(u.alturaLarguraFoto(img.getArea(), img.getAspectRatio()).at(1));
		img.setTamAlt(u.alturaLarguraFoto(img.getArea(), img.getAspectRatio()).at(0));
	}	
	return imagens;
}

/*
	Funcao usada para retonar o aspecto da imagem que sera utilizado para o corte de uma imagem.
*/
double getAspect(double larg, double alt){
	if( larg > alt){
		return larg/alt;
	}else{
		return alt/larg;
	}
}

/*
	Funcao usada para realizar a chamada ao modulo de corte de imagens AutoCropp.
*/
string getCropp(string path, double aspect){
	std::stringstream s0;
	s0 << aspect;

	string command("AutoCrop.exe ");
	command.append(path);
	command.append(" ");
	command.append(s0.str());
	system(command.c_str());

	return path.substr(0, path.find_last_of(".")).append("-Cropp.jpg");
}

/*
	Funcao usada para insercao de legenda nas imagens dos foto-livros gerados.
*/
void insertText(HPDF_Doc pdf, HPDF_Page page, double width, double height, double beta, string legenda)
{
	HPDF_Font font;
	Texto *text;	
	text = new Texto();
	text->setFont("Helvetica");
	text->setTamanho(12);
	text->setConteudo(legenda);
	font = HPDF_GetFont(pdf, text->getFont(), NULL);
	
	HPDF_Page_Rectangle (page, 0, 0, 0, 0);
		
    HPDF_Page_Stroke (page);
    HPDF_Page_BeginText (page);
	HPDF_Page_SetFontAndSize (page, font, text->getTamanho());
	HPDF_Page_TextRect (page, beta, HPDF_Page_GetHeight(page)-20, 
		width, beta, text->getConteudo(), HPDF_TextAlignment(3), NULL);
    HPDF_Page_EndText (page);
}


/*
	Procedimento usado para atualizar as importancias das imagens.
	Recebe dois vetores como parametro, o vetor de imagens, 
	vetor de importancias e o vetor de path das imagens.
*/


void setOrdem(Imagem* im, int ordem) {
    im->setOrdem(ordem);
}

void updateImportance(vector<Imagem> imagens, vector<int> importancia, vector<string> path){
	for (int i = 0; i < imagens.size(); i++){
		for(int j = 0; j < importancia.size(); j++){
			if(imagens.at(i).getPath() == path.at(j)){
//				(&(imagens.at(i)))->setOrdem(importancia.at(j);
//                            (&(imagens.at(i)))->setOrdem(importancia.at(j));
                            setOrdem(&imagens.at(i), importancia.at(j));
                            cout << imagens.at(j).getPath() << " " << importancia.at(j) << " " << imagens.at(j).getOrdem() << endl;
			}
		}				
	}

/*	Imagem aux;
	for(int j=0; j<imagens.size(); j++) {
		for(int i=0; i<imagens.size()-1; i++){
			if(imagens.at(i).getOrdem()>imagens.at(i+1).getOrdem()){
				aux = imagens.at(i);
				imagens.at(i) = imagens.at(i+1);
				imagens.at(i+1) = aux;
			}
		}
	}*/
}

bool comparadorImportancia(Imagem a, Imagem b) {
    return a.getOrdem() < b.getOrdem();
}

void imprimeArvore(Node* raiz) {
    if(raiz != NULL) {
        cout << "(";
        switch(raiz->getType()) {
            case LEAF:
                cout << raiz->getImage().getName() << "[" << raiz->getImage().getOrdem() << "]";
                break;
            case BISS_H:
                imprimeArvore(raiz->getLeft());
                cout << " H ";
                imprimeArvore(raiz->getRight());
                break;
            case BISS_V:
                imprimeArvore(raiz->getLeft());
                cout << " V ";
                imprimeArvore(raiz->getRight());
                break;
        }
        cout << ")";
    }
}

void imprimeListaImagens(vector<Imagem> imagens) {
    for(int i = 0; i < imagens.size(); i++) {
        cout << imagens.at(i).getName() << "\t" << imagens.at(i).getId() << endl;
    }
}

void updateConteudo(vector<Imagem> imagens, vector<string> legenda) {
    for(int i = 0; i < imagens.size(); i++)
        imagens.at(i).setConteudo(legenda.at(i));
}

/*
	Funcao usada instanciar os objetos que serao usados numa execucao do programa - funcao principal, main.
*/
int main(){
    Util u;
    string arq;
    vector<string> path;
    vector<string> legenda;
    vector<int> importancia;
    HPDF_Doc pdf = u.initPDF();
    double beta = 1;
    double alpha = 1;
    Pagina pag;
    pag.setDirecao(1);
    pag.setDimensao(1);

//	cout<<"Informe o Arquivo de configuracoes: ";
//	cin>>arq;
    arq = "C:\\files\\Alysson-2010\\2010\\Implementacao\\BRICimplementationWithAC\\BRICimplementation\\set1.txt";
/*	vector<string> fileContent = u.readFile(arq);

    cout << "inicio\n";
    for(int i = 0; i < fileContent.size(); i++){
        cout << fileContent.at(i) << endl;
            path.push_back(fileContent.at(i).substr(0, fileContent.at(i).find_first_of(",")));
            fileContent.at(i) = fileContent.at(i).substr(fileContent.at(i).find_first_of(",")+1, fileContent.at(i).size());
            importancia.push_back(atoi(fileContent.at(i).substr(0, fileContent.at(i).find_first_of(",")).c_str()));
            fileContent.at(i) = fileContent.at(i).substr(fileContent.at(i).find_first_of(",")+1, fileContent.at(i).size());
            legenda.push_back(fileContent.at(i).substr(0, fileContent.at(i).size()));
    }
    cout << "fim\n";

    vector<Imagem> imagens = u.getImages2(pdf, path);
    updateImportance(imagens, importancia, path);*/
//        updateConteudo(imagens, legenda);

    vector<Imagem> imagens = u.loadImageList(arq, pdf);
    sort(imagens.begin(), imagens.end(), comparadorImportancia);
    imprimeListaImagens(imagens);

//        Node raiz(imagens, 800, 600);
    Node raiz( //v
        new Node( //h
            new Node( //v
                new Node(imagens.at(0)),
                BISS_V,
                new Node(imagens.at(4))
            ),
            BISS_H,
            new Node(imagens.at(2))
        ),
        BISS_V,
        new Node( //h
            new Node(imagens.at(1)),
            BISS_H,
            new Node(imagens.at(3))
        )
    );

    raiz.setBounds(800, 600);
    imprimeArvore(&raiz);

    cout << "\n**WIDTH\n";
    raiz.normalize(alpha, beta, u, WIDTH);
    cout << "\n**HEIGHT\n";
    raiz.normalize(alpha, beta, u, HEIGHT);
//       imprimeArvore(&raiz);
        
        
/*        vector<Nodo*> nodos = montaArvore(imagens);
        for(int i = 0; i < nodos.size(); i++)
            cout << nodos.at(i)->getName() << endl;*/
        
        /*
         Nodo raiz = montaArvore(imagens);
         raiz = atualizaDimensoes(raiz, alpha, beta, largura, algura);
         desenhaArvore(raiz, pdf);
         */
        
        //c1
	
	/*string file = "";
	cout<<"Informe o titulo do PhotoBook: ";
	cin>>file;
	
	//Salvando o arquivo pdf.	
	u.savePDF(pdf, file);*/

	//system("pause");
	return 0;
}
//c1
        /*
        if(size <= 5){
		updateImportance(imagens, importancia, path);
		switch(size){
		case 1:
			drawOne(imagens, 0, pag, pdf, beta, u, legenda);
			break;
		case 2:
			drawTwo(imagens, 0, pag, pdf, beta, u);
			break;
		case 3:
			drawThree(imagens, 0, pag, pdf, beta, u);
			break;
		case 4:
			drawFour(imagens, 0, pag, pdf, beta, u);
			break;
		case 5:
			drawFive(imagens, 0, pag, pdf, beta, u);
			break;
		default:
			break;
		}
	}else{
		pag.setHpdfPage(u.initPage(pdf, pag));
		double espacoHorizDisp = pag.getWidth() - (((size/4)+1)*beta);
		double espacoVertDisp = pag.getHeight() - (5*beta);
		double posHoriz = beta;
		double posVert = beta;
		double dimensaoHoriz = espacoHorizDisp/ceil(size/4.0);
		double dimensaoVert = espacoVertDisp/4;
		string name = "";
		for(int i = 0; i < size/4; i++){
			if(i == (size/4)-1){
				double aux = pag.getWidth() - beta - posHoriz;
				name = getCropp(imagens.at(i).getPath(), getAspect(aux, dimensaoVert));
				HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), 
					posHoriz, posVert, aux, dimensaoVert);
			} else{
				name = getCropp(imagens.at(i).getPath(),
					getAspect(dimensaoHoriz, dimensaoVert));
				HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), 
					posHoriz, posVert, dimensaoHoriz, dimensaoVert);
			}
			posHoriz += dimensaoHoriz + beta;
		}
		posVert += dimensaoVert + beta;
		posHoriz = beta;
		for(int i = size/4; i < size/2; i++){
			if(i == (size/2)-1){
				double aux = pag.getWidth() - beta - posHoriz;
				name = getCropp(imagens.at(i).getPath(), getAspect(aux, dimensaoVert));
				HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), 
					posHoriz, posVert, aux, dimensaoVert);
			} else{
				name = getCropp(imagens.at(i).getPath(), getAspect(dimensaoHoriz, dimensaoVert));
				HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name),
					posHoriz, posVert, dimensaoHoriz, dimensaoVert);
			}
			posHoriz += dimensaoHoriz + beta;
		}
		posVert += dimensaoVert + beta;
		posHoriz = beta;
		for(int i = (size/2); i < (3*size)/4; i++){
			if(i == (3*size/4)-1){
				double aux = pag.getWidth() - beta - posHoriz;
				name = getCropp(imagens.at(i).getPath(), getAspect(aux, dimensaoVert));
				HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), 
					posHoriz, posVert, aux, dimensaoVert);
			} else{
				name = getCropp(imagens.at(i).getPath(), getAspect(dimensaoHoriz, dimensaoVert));
				HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name),
					posHoriz, posVert, dimensaoHoriz, dimensaoVert);
			}
			posHoriz += dimensaoHoriz + beta;
		}
		posVert += dimensaoVert + beta;
		posHoriz = beta;
		for(int i = (3*size/4); i < size; i++){
			if(i == size-1){
				double aux = pag.getWidth() - beta - posHoriz;
				name = getCropp(imagens.at(i).getPath(), getAspect(aux, dimensaoVert));
				HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), 
					posHoriz, posVert, aux, dimensaoVert);
			} else{
				name = getCropp(imagens.at(i).getPath(), getAspect(dimensaoHoriz, dimensaoVert));
				HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name),
					posHoriz, posVert, dimensaoHoriz, dimensaoVert);
			}
			posHoriz += dimensaoHoriz + beta;
		}
		
	}*/
        /*int divisor = size/5;
		int resto = size%5;
		int posicao = (size/5)*5;

		for(int i=0; i < divisor; i++){
			drawFive(imagens, i*5, pag, pdf, beta, u);
		}
		switch(resto){
		case 1:
			drawOne(imagens, posicao, pag, pdf, beta, u);
			break;
		case 2:
			drawTwo(imagens, posicao, pag, pdf, beta, u);
			break;
		case 3:
			drawThree(imagens, posicao, pag, pdf, beta, u);
			break;
		case 4:
			drawFour(imagens, posicao, pag, pdf, beta, u);
			break;
		case 5:
			drawFive(imagens, posicao, pag, pdf, beta, u);
			break;
		default:
			break;
		}*/


/*
void drawOne(vector<Imagem> imagens, int posicao, Pagina pag, HPDF_Doc pdf, int beta, Util u, vector<string> legenda){
	double alt = 0;
	double larg = 0;
	string name= "";
	pag.setHpdfPage(u.initPage(pdf, pag));
	larg = pag.getWidth() - (50*beta);
	alt = (pag.getHeight() - (2*beta))/2;
	insertText(pdf, pag.getHpdfPage(), larg, alt, 25*beta, legenda.at(posicao));
	name = getCropp(imagens.at(posicao).getPath(), getAspect(larg, alt));
	HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), 25*beta, beta, larg, alt);
}

void drawTwo(vector<Imagem> imagens, int posicao, Pagina pag, HPDF_Doc pdf, int beta, Util u){
	double alt = 0;
	double larg = 0;
	string name= "";
	pag.setHpdfPage(u.initPage(pdf, pag));
	if(imagens.at(posicao).getAspectRatio() >=1){
		larg = 0.6*pag.getWidth();
	} else{
		larg = 0.4*pag.getWidth();
	}
	alt = pag.getHeight()-(2*beta);
	
	name = getCropp(imagens.at(posicao).getPath(), getAspect(larg, alt));
	imagens.at(posicao).setTamAlt(alt);
	imagens.at(posicao).setTamLarg(larg);

	HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), 
		beta, beta, imagens.at(posicao).getTamLarg(), imagens.at(posicao).getTamAlt());

	imagens.at(posicao).setPosHoriz(beta+imagens.at(posicao).getTamLarg());

	larg = pag.getWidth() - (3*beta) - imagens.at(posicao).getTamLarg();
	alt = pag.getHeight()-(2*beta);
	name = getCropp(imagens.at(posicao+1).getPath(), getAspect(larg, alt));

	imagens.at(posicao+1).setTamAlt(alt);
	imagens.at(posicao+1).setTamLarg(larg);
	HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), 
		imagens.at(posicao).getPosHoriz()+beta, beta, 
		imagens.at(posicao+1).getTamLarg(), imagens.at(posicao+1).getTamAlt());
}

void drawThree(vector<Imagem> imagens, int i, Pagina pag, HPDF_Doc pdf, int beta, Util u){
	double alt = 0;
	double larg = 0;
	string name= "";
	pag.setHpdfPage(u.initPage(pdf, pag));
	if(imagens.at(i).getAspectRatio() >= 1){
		imagens.at(i).setTamLarg(0.6*pag.getWidth());
		imagens.at(i).setTamAlt(u.getAlturaByLargura(imagens.at(i).getAspectRatio(), imagens.at(i).getTamLarg()));
	}else{
		imagens.at(i).setTamAlt(0.6*pag.getHeight());
		imagens.at(i).setTamLarg(u.getLarguraByAltura(imagens.at(i).getAspectRatio(), imagens.at(i).getTamAlt()));
	}

	HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage(pdf, imagens.at(i)), 
		beta, beta, imagens.at(i).getTamLarg(), imagens.at(i).getTamAlt());
		imagens.at(i).setPosVert(beta+imagens.at(i).getTamAlt());
		imagens.at(i).setPosHoriz(beta+imagens.at(i).getTamLarg());
			
	imagens.at(i+1).setTamAlt(imagens.at(i).getTamAlt());
	larg = u.getLarguraByAltura(imagens.at(i+1).getAspectRatio(), imagens.at(i+1).getTamAlt());
	if(pag.getWidth() - (3*beta) - imagens.at(i).getTamLarg() < larg){
		larg = pag.getWidth() - (3*beta) - imagens.at(i).getTamLarg();
	}
	alt = imagens.at(i+1).getTamAlt();
	name = getCropp(imagens.at(i+1).getPath(), getAspect(larg, alt));
	imagens.at(i+1).setTamLarg(larg);				
	HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), 
		imagens.at(i).getPosHoriz()+beta, beta, 
		imagens.at(i+1).getTamLarg(), imagens.at(i+1).getTamAlt());

	alt = pag.getHeight() - (3*beta) - imagens.at(i).getTamAlt();
	larg = imagens.at(i).getTamLarg() + imagens.at(i+1).getTamLarg() + beta;
	name = getCropp(imagens.at(i+2).getPath(), getAspect(larg, alt));
	HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), beta, 
		imagens.at(i).getPosVert()+beta, larg, alt);
}

void drawFour(vector<Imagem> imagens, int i, Pagina pag, HPDF_Doc pdf, int beta, Util u){
	double alt = 0;
	double larg = 0;
	string name= "";
	pag.setHpdfPage(u.initPage(pdf, pag));
	if(imagens.at(i).getAspectRatio() >= 1){
		imagens.at(i).setTamLarg(0.6*pag.getWidth());
		imagens.at(i).setTamAlt(u.getAlturaByLargura(imagens.at(i).getAspectRatio(), imagens.at(i).getTamLarg()));
	}else{
		imagens.at(i).setTamAlt(0.6*pag.getHeight());
		imagens.at(i).setTamLarg(u.getLarguraByAltura(imagens.at(i).getAspectRatio(), imagens.at(i).getTamAlt()));
	}
	HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage(pdf, imagens.at(i)), 
		beta, beta, imagens.at(i).getTamLarg(), imagens.at(i).getTamAlt());
	imagens.at(i).setPosVert(beta+imagens.at(i).getTamAlt());
	imagens.at(i).setPosHoriz(beta+imagens.at(i).getTamLarg());

	alt = pag.getHeight() - (3*beta) - imagens.at(i).getTamAlt();
	larg = imagens.at(i).getTamLarg();
	name = getCropp(imagens.at(i+2).getPath(), getAspect(larg, alt));
	HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), beta, imagens.at(i).getPosVert()+beta, larg, alt);

	imagens.at(i+1).setTamAlt(imagens.at(i).getTamAlt());
	larg = u.getLarguraByAltura(imagens.at(i+1).getAspectRatio(), imagens.at(i+1).getTamAlt());
	if(pag.getWidth() - (3*beta) - imagens.at(i).getTamLarg() < larg){
		larg = pag.getWidth() - (3*beta) - imagens.at(i).getTamLarg();
	}
	alt = imagens.at(i+1).getTamAlt();
	name = getCropp(imagens.at(i+1).getPath(), getAspect(larg, alt));
	imagens.at(i+1).setTamLarg(larg);				
	HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), 
		imagens.at(i).getPosHoriz()+beta, beta, imagens.at(i+1).getTamLarg(), imagens.at(i+1).getTamAlt());
	imagens.at(i+1).setPosVert(beta+imagens.at(i+1).getTamAlt());

	imagens.at(i+3).setTamLarg(imagens.at(i+1).getTamLarg());
	alt = pag.getHeight() - (3*beta) - imagens.at(i+1).getTamAlt();
	larg = imagens.at(i+3).getTamLarg();
	name = getCropp(imagens.at(i+3).getPath(), getAspect(larg, alt));
	imagens.at(i+3).setTamAlt(alt);
	HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), 
		imagens.at(i).getPosHoriz()+beta, imagens.at(i+1).getPosVert()+beta, 
		imagens.at(i+3).getTamLarg(), imagens.at(i+3).getTamAlt());
}

void drawFive(vector<Imagem> imagens, int i, Pagina pag, HPDF_Doc pdf, int beta, Util u){
	double alt = 0;
	double larg = 0;
	string name= "";
	pag.setHpdfPage(u.initPage(pdf, pag));
	if(imagens.at(i).getAspectRatio() >= 1){
		imagens.at(i).setTamLarg(0.6*pag.getWidth());
		imagens.at(i).setTamAlt(u.getAlturaByLargura(imagens.at(i).getAspectRatio(), imagens.at(i).getTamLarg()));
	}else{
		imagens.at(i).setTamAlt(0.6*pag.getHeight());
		imagens.at(i).setTamLarg(u.getLarguraByAltura(imagens.at(i).getAspectRatio(), imagens.at(i).getTamAlt()));
	}

	HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage(pdf, imagens.at(i)), 
				beta, beta, imagens.at(i).getTamLarg(), imagens.at(i).getTamAlt());
	imagens.at(i).setPosVert(beta+imagens.at(i).getTamAlt());
	imagens.at(i).setPosHoriz(beta+imagens.at(i).getTamLarg());
	if(imagens.at(i+2).getAspectRatio() < 1){
	imagens.at(i+2).setTamLarg(imagens.at(i).getTamLarg()*0.48);
	}else if(imagens.at(i+2).getAspectRatio() >= 1 && imagens.at(i+3).getAspectRatio() >= 1){
		imagens.at(i+2).setTamLarg(imagens.at(i).getTamLarg()*0.48); 
	} else{
		imagens.at(i+2).setTamLarg(imagens.at(i).getTamLarg()*0.6);						
	}
	alt = pag.getHeight() - (3*beta) - imagens.at(i).getTamAlt();
	larg = imagens.at(i+2).getTamLarg();
					
	name = getCropp(imagens.at(i+2).getPath(), getAspect(larg, alt));
	imagens.at(i+2).setTamAlt(alt);
	HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), 
		beta, imagens.at(i).getPosVert()+beta, imagens.at(i+2).getTamLarg(), imagens.at(i+2).getTamAlt());
	imagens.at(i+2).setPosVert(imagens.at(i).getPosVert()+beta+imagens.at(i+2).getTamAlt());
	imagens.at(i+2).setPosHoriz(beta+imagens.at(i+2).getTamLarg());

	alt = pag.getHeight() - (3*beta) - imagens.at(i).getTamAlt();
	larg = imagens.at(i).getTamLarg()-beta-imagens.at(i+2).getTamLarg();

	name = getCropp(imagens.at(i+3).getPath(), getAspect(larg, alt));
	imagens.at(i+3).setTamAlt(alt);
	imagens.at(i+3).setTamLarg(larg);

	HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), 
		imagens.at(i+2).getPosHoriz()+beta, imagens.at(i).getPosVert()+beta, 
		imagens.at(i+3).getTamLarg(), imagens.at(i+3).getTamAlt());

	imagens.at(i+1).setTamAlt(imagens.at(i).getTamAlt());
	larg = u.getLarguraByAltura(imagens.at(i+1).getAspectRatio(), imagens.at(i+1).getTamAlt());

	if(pag.getWidth() - (3*beta) - imagens.at(i).getTamLarg() < larg){
		larg = pag.getWidth() - (3*beta) - imagens.at(i).getTamLarg();
	}
	alt = imagens.at(i+1).getTamAlt();

	name = getCropp(imagens.at(i+1).getPath(), getAspect(larg, alt));
	imagens.at(i+1).setTamLarg(larg);

	imagens.at(i+1).setPosVert(beta+imagens.at(i+1).getTamAlt());
	imagens.at(i+1).setPosHoriz(imagens.at(i).getPosHoriz()+beta+imagens.at(i+1).getTamAlt());
				
	HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), 
		imagens.at(i).getPosHoriz()+beta, beta, 
		imagens.at(i+1).getTamLarg(), imagens.at(i+1).getTamAlt());
	imagens.at(i+4).setTamLarg(imagens.at(i+1).getTamLarg());
	alt = pag.getHeight() - (3*beta) - imagens.at(i+1).getTamAlt();
	larg = imagens.at(i+4).getTamLarg();
														
	name = getCropp(imagens.at(i+4).getPath(), getAspect(larg, alt));
	imagens.at(i+4).setTamAlt(alt);

	HPDF_Page_DrawImage(pag.getHpdfPage(), u.loadImage2(pdf, name), 
		imagens.at(i).getPosHoriz()+beta, imagens.at(i+1).getPosVert()+beta, 
		imagens.at(i+4).getTamLarg(), imagens.at(i+4).getTamAlt());
	
}*/
